package cn.edu.nwpu.warehousemanagement.dao;

import cn.edu.nwpu.warehousemanagement.constantEnum.UserRole;
import cn.edu.nwpu.warehousemanagement.pojo.User;
import jakarta.annotation.Nonnull;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

/**
 * 用户DAO接口
 *
 * @author Loadstar
 * @version 1.0
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 根据用户名查询用户，排除已软删除的用户
     *
     * @param username 用户名
     * @return 用户对象
     */
    @Query("SELECT u FROM User u WHERE u.deleted = false AND u.username = :username")
    User findByUsername(String username);

    /**
     * 根据用户ID更新密码
     *
     * @param id       用户ID
     * @param password 新密码
     */
    @Transactional
    @Modifying
    @Query("UPDATE User u SET u.password = :password WHERE u.id = :id")
    void updatePasswordById(@Param("id") Long id,
                            @Param("password") String password);


    /**
     * 根据用户ID删除用户，逻辑删除
     *
     * @param id 用户ID
     */
    @Transactional
    @Modifying
    @Query("UPDATE User u SET u.deleted = true WHERE u.id = :id")
    void deleteById(@Param("id") @Nonnull Long id);

    /**
     * 根据用户ID更新用户信息
     *
     * @param userId   用户ID
     * @param realname 真实姓名
     * @param phone    手机号
     * @param email    邮箱
     * @param role     角色
     */
    @Transactional
    @Modifying
    @Query("UPDATE User u SET u.realName = :realname, u.phone = :phone, u.email = :email, u.role = :role WHERE u.id = :userId")
    //注意：u.realName = :realname中u.realName是pojo里的属性名，
    void updateUserById(@Param("userId") Long userId,
                        @Param("realname") String realname,
                        @Param("phone") String phone,
                        @Param("email") String email,
                        @Param("role") UserRole role);

    /**
     * 查询所有未软删除的用户
     *
     * @param pageable 分页信息
     * @return 分页后的用户列表
     */
    @Query("SELECT u FROM User u WHERE u.deleted = false ")
    Page<User> findAllNotDeleted(Pageable pageable);

    /**
     * 根据用户ID查询用户，排除已软删除的用户
     *
     * @param id 用户ID
     */

    @Query("SELECT u FROM User u WHERE u.deleted = false AND u.id = :id")
    User findByIdAndDeletedFalse(@Param("id") Long id);
}
